From 4220c9529623fc1dc66ee4b77b127e90f088ca92 Mon Sep 17 00:00:00 2001 From: "Karl O. Pinc kop@karlpinc.com" Date: Sat, 18 Jul 2026 00:08:08 +0000 Subject: [PATCH] Make macros to generate all the ELO_RANK_DAILY_*_* tables Use the macros to generate everything concering the ELO_RANKS_DAILY_KK_F table. --- db/include/elo_ranks_daily_triggers_create.m4 | 122 +++++++++++ db/include/elo_ranks_daily_triggers_drop.m4 | 43 ++++ db/include/indexmacros.m4 | 66 ++++++ db/include/tablemacros.m4 | 29 +++ .../triggers/create/elo_ranks_daily_kk_f.m4 | 76 +------ .../lib/triggers/drop/elo_ranks_daily_kk_f.m4 | 3 +- .../indexes/create/elo_ranks_daily_kk_f.m4 | 27 +-- .../indexes/drop/elo_ranks_daily_kk_f.m4 | 11 +- .../tables/create/elo_ranks_daily_kk_f.m4 | 14 +- doc/include/elo_ranks_daily_macro.m4 | 203 ++++++++++++++++++ doc/include/macros.m4 | 34 +++ doc/src/analyzed/elo_ranks_daily_kk_f.m4 | 172 +-------------- doc/src/epilog.inc.m4 | 22 +- 13 files changed, 508 insertions(+), 314 deletions(-) create mode 100644 db/include/elo_ranks_daily_triggers_create.m4 create mode 100644 db/include/elo_ranks_daily_triggers_drop.m4 create mode 100644 doc/include/elo_ranks_daily_macro.m4 diff --git a/db/include/elo_ranks_daily_triggers_create.m4 b/db/include/elo_ranks_daily_triggers_create.m4 new file mode 100644 index 0000000..74e8563 --- /dev/null +++ b/db/include/elo_ranks_daily_triggers_create.m4 @@ -0,0 +1,122 @@ +dnl Copyright (C) 2026 The Meme Factory, Inc. http://www.karlpinc.com/ +dnl +dnl This program is free software: you can redistribute it and/or modify it +dnl under the terms of the GNU Affero General Public License as published by +dnl the Free Software Foundation, either version 3 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +dnl GNU Affero General Public License for more details. +dnl +dnl You should have received a copy of the GNU Affero General Public License +dnl along with this program. If not, see . +dnl +dnl Triggers for the elo_ranks_daily_kk_f table +dnl +dnl Karl O. Pinc +dnl +dnl Remarks: +dnl Don't bother with the fancy stuff where we detect re-inclusion +dnl of the file and do nothing if we find the file already included. +dnl + +dnl m4 includes +include(`constants.m4')dnl +include(`macros.m4')dnl +dnl Don't output anything while defining macros. +divert(`-1') + +dnl Create the triggers for a elo_ranks_daily_*_* table +dnl +dnl Syntax: elo_ranks_daily_triggers_create(sex_name, sex_code, commid) +dnl +dnl sex_name The name of the sex, as text (female or male) +dnl sex_code The code for the sex (sdb_female or sdb_male) +dnl commid The code for the community (KK or MT) +dnl +dnl Remarks: +dnl Relies on codes being upper case, and PG normalizing them to lower case. +dnl +changequote([,]) +define([elo_ranks_daily_triggers_create], +[RAISE INFO 'elo_ranks_daily_$3_$2_func'; +CREATE OR REPLACE FUNCTION elo_ranks_daily_$3_$2_func () + RETURNS trigger + LANGUAGE plpgsql + sdb_function_set_search_path + AS $$ + BEGIN + -- Function for elo_ranks_daily_$3_$2 insert and update triggers + -- + -- AGPL_notice(` --', `2026', + `The Meme Factory, Inc., www.karlpinc.com') + + IF TG_OP = 'UPDATE' THEN + cannot_change(`ELO_RANKS_DAILY_$3_$2', `ID') + END IF; + + IF TG_OP = 'INSERT' + OR NEW.individual <> OLD.individual THEN + -- The individual must be $1. + DECLARE + -- BIOGRAPHY_DATA + a_sex biography_data.sex%TYPE; + a_birthdate biography_data.birthdate%TYPE; + + BEGIN + -- Get the data we need, and that needed for error message content too + SELECT biography_data.sex, biography_data.birthdate + INTO a_sex , a_birthdate + FROM biography_data + WHERE biography_data.animid = NEW.individual + AND biography_data.sex <> '$2'; + IF FOUND THEN + RAISE EXCEPTION integrity_constraint_violation USING + MESSAGE = 'Error on ' || TG_OP || ' of FERTILITY' + , DETAIL = 'The Individual must be a $1' + || ': Key (ID) = (' + || NEW.id + || '): Value (Date) = (' + || NEW.date + || '): Value (Individual) = (' + || NEW.individual + || '): Value (Elo) = (' + || NEW.elo + || '): Value (EloOrdinal) = (' + || NEW.eloordinal + || '): Value (EloScaled) = (' + || NEW.eloscaled + || '): Value (ExpNumBeaten) = (' + || NEW.expnumbeaten + || '): Value (EloCardinal) = (' + || NEW.elocardinal + || '): Value (JenksEloCardinal) = (' + || NEW.jenkselocardinal + || '): Key (BIOGRAPHY_DATA.AnimID) = (' + || NEW.individual + || '), Value (BIOGRAPHY_DATA.Sex) = (' + || a_sex + || '): Value (BIOGRAPHY_DATA.BirthDate) = (' + || a_birthdate + || ')'; + END IF; + END; + END IF; + + RETURN NULL; + END; +$$; + + +RAISE INFO 'elo_ranks_daily_$3_$2_trigger'; +CREATE TRIGGER elo_ranks_daily_$3_$2_trigger + AFTER INSERT OR UPDATE + ON elo_ranks_daily_$3_$2 FOR EACH ROW + EXECUTE PROCEDURE elo_ranks_daily_$3_$2_func(); +])dnl +changequote(`,')dnl See above + +-- Done defining macros. +divert(`0')dnl diff --git a/db/include/elo_ranks_daily_triggers_drop.m4 b/db/include/elo_ranks_daily_triggers_drop.m4 new file mode 100644 index 0000000..19f7169 --- /dev/null +++ b/db/include/elo_ranks_daily_triggers_drop.m4 @@ -0,0 +1,43 @@ +dnl Copyright (C) 2026 The Meme Factory, Inc. http://www.karlpinc.com/ +dnl +dnl This program is free software: you can redistribute it and/or modify +dnl it under the terms of the GNU Affero General Public License as published by +dnl the Free Software Foundation, either version 3 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +dnl GNU Affero General Public License for more details. +dnl +dnl You should have received a copy of the GNU Affero General Public License +dnl along with this program. If not, see . +dnl +dnl Drop triggers for elo_ranks_daily_kk_f table +dnl +dnl Karl O. Pinc +dnl +dnl Remarks: +dnl Don't bother with the fancy stuff where we detect re-inclusion +dnl of the file and do nothing if we find the file already included. +dnl +dnl +dnl Don't output anything while defining macros. +divert(`-1') + +dnl Drop the triggers of an elo_ranks_daily_*_* table +dnl +dnl Syntax: elo_ranks_daily_triggers_drop(sex_code, commid) +dnl +dnl sex_code The code for the sex (sdb_female or sdb_male) +dnl commid The code for the community (KK or MT) +dnl +dnl Remarks: +dnl Relies on PG normalizing the codes to lower case. +dnl +define(`elo_ranks_daily_triggers_drop', +`DROP FUNCTION IF EXISTS elo_ranks_daily_$2_$1_func() CASCADE; +')dnl + +-- Done defining macros. +divert(`0')dnl diff --git a/db/include/indexmacros.m4 b/db/include/indexmacros.m4 index e5da79a..2155c3d 100644 --- a/db/include/indexmacros.m4 +++ b/db/include/indexmacros.m4 @@ -46,6 +46,72 @@ divert(`-1') -- Syntax: sdb_case_equvalence(sql_expression) define(`sdb_case_equivalence', `lower(normalize($1))') + +-- Create the indexes for a elo_ranks_daily_*_* table +-- +-- Syntax: elo_ranks_daily_indexes_create(sex_code, commid) +-- +-- sex_code The code for the sex (sdb_female or sdb_male) +-- commid The code for the community (KK or MT) +-- +-- Remarks: +-- Relies on codes being upper case, and PG normalizing them to lower case. +-- +define(`elo_ranks_daily_indexes_create', +`CREATE UNIQUE INDEX IF NOT EXISTS + "On ELO_RANKS_DAILY_KK_F, Date + Individual must be unique" + ON elo_ranks_daily_kk_f + (date, individual); + +CREATE INDEX IF NOT EXISTS elo_ranks_daily_kk_f_individual + ON elo_ranks_daily_kk_f + (individual); +CREATE INDEX IF NOT EXISTS elo_ranks_daily_kk_f_elo + ON elo_ranks_daily_kk_f + (elo); +CREATE INDEX IF NOT EXISTS elo_ranks_daily_kk_f_eloordinal + ON elo_ranks_daily_kk_f + (eloordinal); +CREATE INDEX IF NOT EXISTS elo_ranks_daily_kk_f_eloscaled + ON elo_ranks_daily_kk_f + (eloscaled); +CREATE INDEX IF NOT EXISTS elo_ranks_daily_kk_f_expnumbeaten + ON elo_ranks_daily_kk_f + (expnumbeaten); +CREATE INDEX IF NOT EXISTS elo_ranks_daily_kk_f_elocardinal + ON elo_ranks_daily_kk_f + (elocardinal); +CREATE INDEX IF NOT EXISTS elo_ranks_daily_kk_f_jenkselocardinal + ON elo_ranks_daily_kk_f + (jenkselocardinal); +')dnl + + + +-- Drop the indexes of an elo_ranks_daily_*_* table +-- +-- Syntax: elo_ranks_daily_indexes_drop(sex_code, commid) +-- +-- sex_code The code for the sex (sdb_female or sdb_male) +-- commid The code for the community (KK or MT) +-- +-- Remarks: +-- Relies on codes being upper case, and PG normalizing them to lower case. +-- +define(`elo_ranks_daily_indexes_drop', +` +DROP INDEX IF EXISTS + "On ELO_RANKS_DAILY_KK_F, Date + Individual must be unique"; + +DROP INDEX IF EXISTS elo_ranks_daily_kk_f_individual; +DROP INDEX IF EXISTS elo_ranks_daily_kk_f_elo; +DROP INDEX IF EXISTS elo_ranks_daily_kk_f_eloordinal; +DROP INDEX IF EXISTS elo_ranks_daily_kk_f_eloscaled; +DROP INDEX IF EXISTS elo_ranks_daily_kk_f_expnumbeaten; +DROP INDEX IF EXISTS elo_ranks_daily_kk_f_elocardinal; +DROP INDEX IF EXISTS elo_ranks_daily_kk_f_jenkselocardinal; +')dnl + -- Done defining macros. divert(`0')dnl diff --git a/db/include/tablemacros.m4 b/db/include/tablemacros.m4 index ca8f2e2..43032ec 100644 --- a/db/include/tablemacros.m4 +++ b/db/include/tablemacros.m4 @@ -348,6 +348,35 @@ define([null_if_not_true], [ CONSTRAINT "$1 must be NULL if $2 is not OR $2)])dnl changequote(`,')dnl See above +-- Create a elo_ranks_daily_*_* table +-- +-- Syntax: elo_ranks_daily_table(sex_code, commid) +-- +-- sex_code The code for the sex (sdb_female or sdb_male) +-- commid The code for the community (KK or MT) +-- +-- Remarks: +-- Relies on codes being upper case, and PG normalizing them to lower case. +-- +changequote([,]) +define([elo_ranks_daily_table], +[CREATE TABLE elo_ranks_daily_$2_$1 ( + key_column(`ELO_RANKS_DAILY_$2_$1', `ID', `INTEGER') + ,date DATE NOT NULL + ,animid_type_column(`individual', `Individual', `NOT NULL') + ,elo DOUBLE PRECISION NOT NULL + ,eloordinal DOUBLE PRECISION NOT NULL + ,eloscaled DOUBLE PRECISION NOT NULL + ,expnumbeaten DOUBLE PRECISION NOT NULL + ,elocardinal DOUBLE PRECISION NOT NULL + ,jenkselocardinal TEXT NOT NULL +); + +grant_priv(`ELO_RANKS_DAILY_$2_$1') +])dnl +changequote(`,')dnl See above + + -- Done defining macros. divert(`0')dnl diff --git a/db/schemas/lib/triggers/create/elo_ranks_daily_kk_f.m4 b/db/schemas/lib/triggers/create/elo_ranks_daily_kk_f.m4 index f8514a9..fed15ac 100644 --- a/db/schemas/lib/triggers/create/elo_ranks_daily_kk_f.m4 +++ b/db/schemas/lib/triggers/create/elo_ranks_daily_kk_f.m4 @@ -21,79 +21,7 @@ dnl m4 includes include(`copyright.m4')dnl include(`constants.m4')dnl include(`macros.m4')dnl +include(`elo_ranks_daily_triggers_create.m4')dnl -RAISE INFO 'elo_ranks_daily_kk_f_func'; -CREATE OR REPLACE FUNCTION elo_ranks_daily_kk_f_func () - RETURNS trigger - LANGUAGE plpgsql - sdb_function_set_search_path - AS $$ - BEGIN - -- Function for elo_ranks_daily_kk_f insert and update triggers - -- - -- AGPL_notice(` --', `2026', - `The Meme Factory, Inc., www.karlpinc.com') - - IF TG_OP = 'UPDATE' THEN - cannot_change(`ELO_RANKS_DAILY_KK_F', `ID') - END IF; - - IF TG_OP = 'INSERT' - OR NEW.individual <> OLD.individual THEN - -- The individual must be female. - DECLARE - -- BIOGRAPHY_DATA - a_sex biography_data.sex%TYPE; - a_birthdate biography_data.birthdate%TYPE; - - BEGIN - -- Get the data we need, and that needed for error message content too - SELECT biography_data.sex, biography_data.birthdate - INTO a_sex , a_birthdate - FROM biography_data - WHERE biography_data.animid = NEW.individual - AND biography_data.sex <> 'sdb_female'; - IF FOUND THEN - RAISE EXCEPTION integrity_constraint_violation USING - MESSAGE = 'Error on ' || TG_OP || ' of FERTILITY' - , DETAIL = 'The Individual must be a female' - || ': Key (ID) = (' - || NEW.id - || '): Value (Date) = (' - || NEW.date - || '): Value (Individual) = (' - || NEW.individual - || '): Value (Elo) = (' - || NEW.elo - || '): Value (EloOrdinal) = (' - || NEW.eloordinal - || '): Value (EloScaled) = (' - || NEW.eloscaled - || '): Value (ExpNumBeaten) = (' - || NEW.expnumbeaten - || '): Value (EloCardinal) = (' - || NEW.elocardinal - || '): Value (JenksEloCardinal) = (' - || NEW.jenkselocardinal - || '): Key (BIOGRAPHY_DATA.AnimID) = (' - || NEW.individual - || '), Value (BIOGRAPHY_DATA.Sex) = (' - || a_sex - || '): Value (BIOGRAPHY_DATA.BirthDate) = (' - || a_birthdate - || ')'; - END IF; - END; - END IF; - - RETURN NULL; - END; -$$; - - -RAISE INFO 'elo_ranks_daily_kk_f_trigger'; -CREATE TRIGGER elo_ranks_daily_kk_f_trigger - AFTER INSERT OR UPDATE - ON elo_ranks_daily_kk_f FOR EACH ROW - EXECUTE PROCEDURE elo_ranks_daily_kk_f_func(); +elo_ranks_daily_triggers_create(`female', sdb_female, `KK') diff --git a/db/schemas/lib/triggers/drop/elo_ranks_daily_kk_f.m4 b/db/schemas/lib/triggers/drop/elo_ranks_daily_kk_f.m4 index 510c713..ea384af 100644 --- a/db/schemas/lib/triggers/drop/elo_ranks_daily_kk_f.m4 +++ b/db/schemas/lib/triggers/drop/elo_ranks_daily_kk_f.m4 @@ -19,5 +19,6 @@ dnl Karl O. Pinc dnl m4 includes include(`copyright.m4')dnl +include(`elo_ranks_daily_triggers_drop.m4')dnl -DROP FUNCTION IF EXISTS elo_ranks_daily_kk_f_func() CASCADE; +elo_ranks_daily_triggers_drop(sdb_female, `KK') diff --git a/db/schemas/sokwedb/indexes/create/elo_ranks_daily_kk_f.m4 b/db/schemas/sokwedb/indexes/create/elo_ranks_daily_kk_f.m4 index a5f8eb0..1290728 100644 --- a/db/schemas/sokwedb/indexes/create/elo_ranks_daily_kk_f.m4 +++ b/db/schemas/sokwedb/indexes/create/elo_ranks_daily_kk_f.m4 @@ -21,29 +21,4 @@ include(`copyright.m4')dnl include(`constants.m4')dnl include(`indexmacros.m4')dnl -CREATE UNIQUE INDEX IF NOT EXISTS - "On ELO_RANKS_DAILY_KK_F, Date + Individual must be unique" - ON elo_ranks_daily_kk_f - (date, individual); - -CREATE INDEX IF NOT EXISTS elo_ranks_daily_kk_f_individual - ON elo_ranks_daily_kk_f - (individual); -CREATE INDEX IF NOT EXISTS elo_ranks_daily_kk_f_elo - ON elo_ranks_daily_kk_f - (elo); -CREATE INDEX IF NOT EXISTS elo_ranks_daily_kk_f_eloordinal - ON elo_ranks_daily_kk_f - (eloordinal); -CREATE INDEX IF NOT EXISTS elo_ranks_daily_kk_f_eloscaled - ON elo_ranks_daily_kk_f - (eloscaled); -CREATE INDEX IF NOT EXISTS elo_ranks_daily_kk_f_expnumbeaten - ON elo_ranks_daily_kk_f - (expnumbeaten); -CREATE INDEX IF NOT EXISTS elo_ranks_daily_kk_f_elocardinal - ON elo_ranks_daily_kk_f - (elocardinal); -CREATE INDEX IF NOT EXISTS elo_ranks_daily_kk_f_jenkselocardinal - ON elo_ranks_daily_kk_f - (jenkselocardinal); +elo_ranks_daily_indexes_create(sdb_female, `KK') diff --git a/db/schemas/sokwedb/indexes/drop/elo_ranks_daily_kk_f.m4 b/db/schemas/sokwedb/indexes/drop/elo_ranks_daily_kk_f.m4 index c4a8fe0..ec94238 100644 --- a/db/schemas/sokwedb/indexes/drop/elo_ranks_daily_kk_f.m4 +++ b/db/schemas/sokwedb/indexes/drop/elo_ranks_daily_kk_f.m4 @@ -21,13 +21,4 @@ include(`copyright.m4')dnl include(`constants.m4')dnl include(`indexmacros.m4')dnl -DROP INDEX IF EXISTS - "On ELO_RANKS_DAILY_KK_F, Date + Individual must be unique"; - -DROP INDEX IF EXISTS elo_ranks_daily_kk_f_individual; -DROP INDEX IF EXISTS elo_ranks_daily_kk_f_elo; -DROP INDEX IF EXISTS elo_ranks_daily_kk_f_eloordinal; -DROP INDEX IF EXISTS elo_ranks_daily_kk_f_eloscaled; -DROP INDEX IF EXISTS elo_ranks_daily_kk_f_expnumbeaten; -DROP INDEX IF EXISTS elo_ranks_daily_kk_f_elocardinal; -DROP INDEX IF EXISTS elo_ranks_daily_kk_f_jenkselocardinal; +elo_ranks_daily_indexes_drop(sdb_female, `KK') diff --git a/db/schemas/sokwedb/tables/create/elo_ranks_daily_kk_f.m4 b/db/schemas/sokwedb/tables/create/elo_ranks_daily_kk_f.m4 index a51271c..b64beec 100644 --- a/db/schemas/sokwedb/tables/create/elo_ranks_daily_kk_f.m4 +++ b/db/schemas/sokwedb/tables/create/elo_ranks_daily_kk_f.m4 @@ -23,16 +23,4 @@ include(`tablemacros.m4')dnl include(`grants.m4')dnl dnl -CREATE TABLE elo_ranks_daily_kk_f ( - key_column(`ELO_RANKS_DAILY_KK_F', `ID', `INTEGER') - ,date DATE NOT NULL - ,animid_type_column(`individual', `Individual', `NOT NULL') - ,elo DOUBLE PRECISION NOT NULL - ,eloordinal DOUBLE PRECISION NOT NULL - ,eloscaled DOUBLE PRECISION NOT NULL - ,expnumbeaten DOUBLE PRECISION NOT NULL - ,elocardinal DOUBLE PRECISION NOT NULL - ,jenkselocardinal TEXT NOT NULL -); - -grant_priv(`ELO_RANKS_DAILY_KK_F') +elo_ranks_daily_table(sdb_female, `KK') diff --git a/doc/include/elo_ranks_daily_macro.m4 b/doc/include/elo_ranks_daily_macro.m4 new file mode 100644 index 0000000..66e6c92 --- /dev/null +++ b/doc/include/elo_ranks_daily_macro.m4 @@ -0,0 +1,203 @@ +.. Copyright (C) 2026 The Meme Factory, Inc. www.karlpinc.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +.. M4 setup +include(constants.m4)dnl +include(macros.m4)dnl +sdb_rst_quotes(`on')dnl + +dnl The documentation for the elo_ranks_daily_*_* tables. +dnl +dnl Syntax: elo_ranks_daily_macro(sex_name, sex_code, commid) +dnl +dnl sex_name The name of the sex, as text (female or male) +dnl sex_code The code for the sex (sdb_female or sdb_male) +dnl commid The code for the community (KK or MT) +dnl +dnl Remarks: +dnl Relies on the sex codes, and, separately, the community codes +dnl being the same length. +dnl +define(*m4[elo_ranks_daily_macro]m4*, +*m4[.. _ELO_RANKS_DAILY_$3_$2: + +ELO_RANKS_DAILY_$3_$2 +-------------------- + +.. |ELO_RANKS_DAILY_$3_$2_summary| replace:: + Each row represents an `Elo ranking`_ of a $1 chimpanzee, on + the given date, within the ``$3`` community. + + +|ELO_RANKS_DAILY_$3_$2_summary| +This table is generated using the EloOptimized_ package of the R_ +statstical computing project. +More information can be found on the EloOptimized_ website. + +The |ELO_RANKS_DAILY_$3_$2.Individual| must be that of a $1. +This means that the related |BIOGRAPHY_DATA|.\ |BIOGRAPHY_DATA.Sex| +value must be ``$2``. + +The columns |ELO_RANKS_DAILY_$3_$2.Elo|\ , +|ELO_RANKS_DAILY_$3_$2.EloOrdinal|\ , |ELO_RANKS_DAILY_$3_$2.EloScaled|\ , +|ELO_RANKS_DAILY_$3_$2.ExpNumBeaten|\ , and +|ELO_RANKS_DAILY_$3_$2.EloCardinal| are all standard +|double precision floating point number|\ s, +a very common computer representation of a +number that is used when non-integral, or very large or very small +values may be encountered. +As such, it has approximately 15 decimal digits of precision and +computations which use its value are inexact, but good enough because +15 decimal digits of precision are good enough. + +An individual can only have one ranking per day. +This means that the combination of |ELO_RANKS_DAILY_$3_$2.Individual| +and |ELO_RANKS_DAILY_$3_$2.Date| must be unique. + + +.. contents:: + :depth: 2 + + +.. _ELO_RANKS_DAILY_$3_$2.ID: + +ID (IDentifier) +``````````````` + +.. |ELO_RANKS_DAILY_$3_$2.ID_summary| replace:: + |idcol| + +|ELO_RANKS_DAILY_$3_$2.ID_summary| +|notnull| + + +.. _ELO_RANKS_DAILY_$3_$2.Date: + +Date +```` + +.. |ELO_RANKS_DAILY_$3_$2.Date_summary| replace:: + The date the $1 was ranked. + +|ELO_RANKS_DAILY_$3_$2.Date_summary| +|notnull| + + +.. _ELO_RANKS_DAILY_$3_$2.Individual: + +Individual +`````````` + +.. |ELO_RANKS_DAILY_$3_$2.Individual_summary| replace:: + The |BIOGRAPHY_DATA|.\ |BIOGRAPHY_DATA.AnimID| of the ranked $1. + +|ELO_RANKS_DAILY_$3_$2.Individual_summary| +|notnull| + + +.. _ELO_RANKS_DAILY_$3_$2.Elo: + +Elo +``` + +.. |ELO_RANKS_DAILY_$3_$2.Elo_summary| replace:: + The Elo ranking of the $1. + +|ELO_RANKS_DAILY_$3_$2.Elo_summary| +Relative Elo rank, calculated from starting value of best-fit model. +(Modeling starting values and k.) + +|notnull| + + +.. _ELO_RANKS_DAILY_$3_$2.EloOrdinal: + +EloOrdinal +`````````` + +.. |ELO_RANKS_DAILY_$3_$2.EloOrdinal_summary| replace:: + The ordinal ranking of the $1. + +|ELO_RANKS_DAILY_$3_$2.EloOrdinal_summary| +The ordinal rank number is based on the raw Elo scores of the +individuals ranked on this date, where ``1`` is the highest rank. + +|notnull| + + +.. _ELO_RANKS_DAILY_$3_$2.EloScaled: + +EloScaled +````````` + +.. |ELO_RANKS_DAILY_$3_$2.EloScaled_summary| replace:: + The scaled ranking of the $1. + +|ELO_RANKS_DAILY_$3_$2.EloScaled_summary| +The Elo score rescaled between 0 and 1 according to the formula:: + + ([individual Elo] + - min([daily Elo scores])/(max([daily Elo scores]) + - min([daily Elo scores])) + +|notnull| + + + +.. _ELO_RANKS_DAILY_$3_$2.ExpNumBeaten: + +ExpNumBeaten +```````````` + +.. |ELO_RANKS_DAILY_$3_$2.ExpNumBeaten_summary| replace:: + Expected number of individuals in the group beaten, calculated as + EloCardinal * number of individuals in group. + +|ELO_RANKS_DAILY_$3_$2.ExpNumBeaten_summary| + +|notnull| + + + +.. _ELO_RANKS_DAILY_$3_$2.EloCardinal: + +EloCardinal +``````````` + +.. |ELO_RANKS_DAILY_$3_$2.EloCardinal_summary| replace:: + Another sort of ranking on a (unvalidated) zero to one scale. + +|ELO_RANKS_DAILY_$3_$2.EloCardinal_summary| +Cardinal ranks following equation (4) in Foerster, Franz et al. 2016; +expected proportion of individuals dominated. + +|notnull| + + + +.. _ELO_RANKS_DAILY_$3_$2.JenksEloCardinal: + +JenksEloCardinal +```````````````` + +.. |ELO_RANKS_DAILY_$3_$2.JenksEloCardinal_summary| replace:: + Categories created by natural jenks algorithm, for each day, based + on the distribution of relative |ELO_RANKS_DAILY_$3_$2.Elo| ranks. + +|ELO_RANKS_DAILY_$3_$2.JenksEloCardinal_summary| +(The categories are not validated.) + +|notnull| +]m4*)dnl diff --git a/doc/include/macros.m4 b/doc/include/macros.m4 index b9f7f50..211efc6 100644 --- a/doc/include/macros.m4 +++ b/doc/include/macros.m4 @@ -81,6 +81,40 @@ define(`sdb_generated_rst', typing "make" at the command line.) ') +dnl +dnl The elo_ranks_daily_*_* rst substutions +dnl +dnl Syntax: elo_ranks_daily_rst(sex_code, commid) +dnl +dnl sex_code The code for the sex (sdb_female or sdb_male) +dnl commid The code for the community (KK or MT) +dnl +changequote([,]) +define([elo_ranks_daily_rst], +[.. |ELO_RANKS_DAILY_$2_$1| replace:: + :ref:`ELO_RANKS_DAILY_$2_$1 ` +.. |ELO_RANKS_DAILY_$2_$1.ID| replace:: + :ref:`ID ` +.. |ELO_RANKS_DAILY_$2_$1.Date| replace:: + :ref:`Date ` +.. |ELO_RANKS_DAILY_$2_$1.Individual| replace:: + :ref:`Individual ` +.. |ELO_RANKS_DAILY_$2_$1.Elo| replace:: + :ref:`Elo ` +.. |ELO_RANKS_DAILY_$2_$1.EloOrdinal| replace:: + :ref:`EloOrdinal ` +.. |ELO_RANKS_DAILY_$2_$1.EloScaled| replace:: + :ref:`EloScaled ` +.. |ELO_RANKS_DAILY_$2_$1.ExpNumBeaten| replace:: + :ref:`ExpNumBeaten ` +.. |ELO_RANKS_DAILY_$2_$1.EloCardinal| replace:: + :ref:`EloCardinal ` +.. |ELO_RANKS_DAILY_$2_$1.JenksEloCardinal| replace:: + :ref:`JenksEloCardinal ` +])dnl +changequote(`,')dnl See above + + dnl dnl Transformations depending on output format dnl diff --git a/doc/src/analyzed/elo_ranks_daily_kk_f.m4 b/doc/src/analyzed/elo_ranks_daily_kk_f.m4 index 88385db..8c4acc3 100644 --- a/doc/src/analyzed/elo_ranks_daily_kk_f.m4 +++ b/doc/src/analyzed/elo_ranks_daily_kk_f.m4 @@ -16,175 +16,7 @@ .. M4 setup include(constants.m4)dnl include(macros.m4)dnl -sdb_rst_quotes(`on')dnl +include(elo_ranks_daily_macro.m4)dnl sdb_generated_rst()dnl -.. _ELO_RANKS_DAILY_KK_F: - -ELO_RANKS_DAILY_KK_F --------------------- - -.. |ELO_RANKS_DAILY_KK_F_summary| replace:: - Each row represents an `Elo ranking`_ of a female chimpanzee, on - the given date, within the ``KK`` community. - - -|ELO_RANKS_DAILY_KK_F_summary| -This table is generated using the EloOptimized_ package of the R_ -statstical computing project. -More information can be found on the EloOptimized_ website. - -The |ELO_RANKS_DAILY_KK_F.Individual| must be that of a female. -This means that the related |BIOGRAPHY_DATA|.\ |BIOGRAPHY_DATA.Sex| -value must be ``sdb_female``. - -The columns |ELO_RANKS_DAILY_KK_F.Elo|\ , -|ELO_RANKS_DAILY_KK_F.EloOrdinal|\ , |ELO_RANKS_DAILY_KK_F.EloScaled|\ , -|ELO_RANKS_DAILY_KK_F.ExpNumBeaten|\ , and -|ELO_RANKS_DAILY_KK_F.EloCardinal| are all standard -|double precision floating point number|\ s, -a very common computer representation of a -number that is used when non-integral, or very large or very small -values may be encountered. -As such, it has approximately 15 decimal digits of precision and -computations which use its value are inexact, but good enough because -15 decimal digits of precision are good enough. - -An individual can only have one ranking per day. -This means that the combination of |ELO_RANKS_DAILY_KK_F.Individual| -and |ELO_RANKS_DAILY_KK_F.Date| must be unique. - - -.. contents:: - :depth: 2 - - -.. _ELO_RANKS_DAILY_KK_F.ID: - -ID (IDentifier) -``````````````` - -.. |ELO_RANKS_DAILY_KK_F.ID_summary| replace:: - |idcol| - -|ELO_RANKS_DAILY_KK_F.ID_summary| -|notnull| - - -.. _ELO_RANKS_DAILY_KK_F.Date: - -Date -```` - -.. |ELO_RANKS_DAILY_KK_F.Date_summary| replace:: - The date the female was ranked. - -|ELO_RANKS_DAILY_KK_F.Date_summary| -|notnull| - - -.. _ELO_RANKS_DAILY_KK_F.Individual: - -Individual -`````````` - -.. |ELO_RANKS_DAILY_KK_F.Individual_summary| replace:: - The |BIOGRAPHY_DATA|.\ |BIOGRAPHY_DATA.AnimID| of the ranked female. - -|ELO_RANKS_DAILY_KK_F.Individual_summary| -|notnull| - - -.. _ELO_RANKS_DAILY_KK_F.Elo: - -Elo -``` - -.. |ELO_RANKS_DAILY_KK_F.Elo_summary| replace:: - The Elo ranking of the female. - -|ELO_RANKS_DAILY_KK_F.Elo_summary| -Relative Elo rank, calculated from starting value of best-fit model. -(Modeling starting values and k.) - -|notnull| - - -.. _ELO_RANKS_DAILY_KK_F.EloOrdinal: - -EloOrdinal -`````````` - -.. |ELO_RANKS_DAILY_KK_F.EloOrdinal_summary| replace:: - The ordinal ranking of the female. - -|ELO_RANKS_DAILY_KK_F.EloOrdinal_summary| -The ordinal rank number is based on the raw Elo scores of the -individuals ranked on this date, where ``1`` is the highest rank. - -|notnull| - - -.. _ELO_RANKS_DAILY_KK_F.EloScaled: - -EloScaled -````````` - -.. |ELO_RANKS_DAILY_KK_F.EloScaled_summary| replace:: - The scaled ranking of the female. - -|ELO_RANKS_DAILY_KK_F.EloScaled_summary| -The Elo score rescaled between 0 and 1 according to the formula:: - - ([individual Elo] - - min([daily Elo scores])/(max([daily Elo scores]) - - min([daily Elo scores])) - -|notnull| - - - -.. _ELO_RANKS_DAILY_KK_F.ExpNumBeaten: - -ExpNumBeaten -```````````` - -.. |ELO_RANKS_DAILY_KK_F.ExpNumBeaten_summary| replace:: - Expected number of individuals in the group beaten, calculated as - EloCardinal * number of individuals in group. - -|ELO_RANKS_DAILY_KK_F.ExpNumBeaten_summary| - -|notnull| - - - -.. _ELO_RANKS_DAILY_KK_F.EloCardinal: - -EloCardinal -``````````` - -.. |ELO_RANKS_DAILY_KK_F.EloCardinal_summary| replace:: - Another sort of ranking on a (unvalidated) zero to one scale. - -|ELO_RANKS_DAILY_KK_F.EloCardinal_summary| -Cardinal ranks following equation (4) in Foerster, Franz et al. 2016; -expected proportion of individuals dominated. - -|notnull| - - - -.. _ELO_RANKS_DAILY_KK_F.JenksEloCardinal: - -JenksEloCardinal -```````````````` - -.. |ELO_RANKS_DAILY_KK_F.JenksEloCardinal_summary| replace:: - Categories created by natural jenks algorithm, for each day, based - on the distribution of relative |ELO_RANKS_DAILY_KK_F.Elo| ranks. - -|ELO_RANKS_DAILY_KK_F.JenksEloCardinal_summary| -(The categories are not validated.) - -|notnull| +elo_ranks_daily_macro(female, sdb_female, KK) diff --git a/doc/src/epilog.inc.m4 b/doc/src/epilog.inc.m4 index e2082a1..dd63caa 100644 --- a/doc/src/epilog.inc.m4 +++ b/doc/src/epilog.inc.m4 @@ -393,26 +393,8 @@ sdb_generated_rst()dnl .. |ED_CERTAINTIES.Code| replace:: :ref:`Code ` -.. |ELO_RANKS_DAILY_KK_F| replace:: - :ref:`ELO_RANKS_DAILY_KK_F ` -.. |ELO_RANKS_DAILY_KK_F.ID| replace:: - :ref:`ID ` -.. |ELO_RANKS_DAILY_KK_F.Date| replace:: - :ref:`Date ` -.. |ELO_RANKS_DAILY_KK_F.Individual| replace:: - :ref:`Individual ` -.. |ELO_RANKS_DAILY_KK_F.Elo| replace:: - :ref:`Elo ` -.. |ELO_RANKS_DAILY_KK_F.EloOrdinal| replace:: - :ref:`EloOrdinal ` -.. |ELO_RANKS_DAILY_KK_F.EloScaled| replace:: - :ref:`EloScaled ` -.. |ELO_RANKS_DAILY_KK_F.ExpNumBeaten| replace:: - :ref:`ExpNumBeaten ` -.. |ELO_RANKS_DAILY_KK_F.EloCardinal| replace:: - :ref:`EloCardinal ` -.. |ELO_RANKS_DAILY_KK_F.JenksEloCardinal| replace:: - :ref:`JenksEloCardinal ` +.. ELO_RANKS_DAILY_KK_F +elo_ranks_daily_rst(sdb_female, KK)dnl .. |ENTRYTYPES| replace:: :ref:`ENTRYTYPES ` .. |ENTRYTYPES.EntryType| replace:: -- 2.34.1